package com.ct.websocket1;

import cn.hutool.core.util.StrUtil;
import cn.hutool.log.StaticLog;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 最简单的websocket通讯
 */

@Component
@ServerEndpoint("/websocket/{uid}") // WebSocket 连接的 URL 格式
public class MyWebSocket {

    // 使用 ConcurrentHashMap 存储所有 WebSocket 连接（键是用户 ID，值是 WebSocket Session）
    private static final ConcurrentHashMap<String, Session> userSessions = new ConcurrentHashMap<>();

    /**
     * 当 WebSocket 连接成功时调用
     *
     * @param session WebSocket 会话
     * @param uid     用户 ID
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("uid") String uid) throws IOException {
        // 存储用户连接
        userSessions.put(uid, session);
        StaticLog.info("用户{}连接成功", uid);

        // 发送欢迎消息
        session.getBasicRemote().sendText(StrUtil.format("你好{},WebSocket 连接成功!", uid));
    }

    /**
     * 当 WebSocket 连接关闭时调用
     *
     * @param uid 用户 ID
     */
    @OnClose
    public void onClose(@PathParam("uid") String uid) {
        // 移除断开的 WebSocket 连接
        userSessions.remove(uid);
        StaticLog.info("用户{}断开连接", uid);
    }

    /**
     * 当收到客户端消息时调用
     *
     * @param message 客户端发送的消息
     * @param uid     发送消息的用户 ID
     * @param session WebSocket 会话
     */
    @OnMessage
    public void onMessage(String message, @PathParam("uid") String uid, Session session) throws IOException {
        StaticLog.info("收到来自用户{}的消息:{} ", uid, message);

        // 服务器端回复消息
        session.getBasicRemote().sendText(StrUtil.format("收到你的消息:{}", message));
    }

    /**
     * 发生错误时调用
     *
     * @param session WebSocket 会话
     * @param error   具体的错误信息
     * @param uid     用户 ID
     */
    @OnError
    public void onError(Session session, Throwable error, @PathParam("uid") String uid) {
        StaticLog.info("用户{}发生错误 ", uid);
        error.printStackTrace();
    }

    /**
     * 服务器主动向指定用户发送消息
     *
     * @param uid     目标用户 ID
     * @param message 发送的消息内容
     */
    public static void sendMessageToUser(String uid, String message) throws IOException {
        Session session = userSessions.get(uid);
        if (session != null && session.isOpen()) {
            session.getBasicRemote().sendText(message);
        }
    }
}